跳到主要内容

Julia 环境

环境是一个上下文,用于确定 importusing 表达式的含义。

  • 项目环境(显式环境):是一个 Julia 项目的文件夹,包含了一个 Project.toml 以及可选的 Manifest.toml 文件
    • Project.toml 定义了直接依赖和相应的 UUID
    • Manifest.toml 定义了依赖树、绝对版本和寻找方法
  • 包文件夹环境(隐式环境):是一个包含了一系列 Julia 包的文件的文件夹
  • Julia 的环境可以堆栈,一个项目环境和包文件夹的有序集合定义了一个复合的环境。

这三种环境分别具有如下用途:

  • 项目环境保证了可重现性
  • 包文件夹环境保证了方便性
  • 堆栈环境让我们可以方便地管理开发工具

项目环境

每个环境定义了三个映射:roots, graph, paths

  • roots: name::Symbol -> uuid::UUID
  • graph: context::UUID -> name::Symbol -> uuid::UUID
  • paths: uuid::UUID, name::Symbol -> path::String

roots 用于确定顶层的包导入指向的是哪个 UUID,graph 用于确定其他的导入指向的是哪个 UUID。确定之后,

  • 如果 Project.toml 即对应 X 和 uuid,那么直接指向 src/X.jl 或 Project.toml 中指定的 path
  • 如果 Manifest.toml 含有 X 和 uuid,采用该节中的 path 或计算 slug = hash(uuid, git-tree-sha1) 并寻找 Julia DEPOT_PATH 中的 packages/X/$slug

包文件夹环境(TODO)

堆栈环境

Julia 的 LOAD_PATH 定义了一个堆栈环境,其默认值为 ["@", "@v#.#", "@stdlib"]

  • @ 表示当前活跃环境(Pkg.jl 能操作的环境)
  • @stdlib 表示标准库
  • @name 表示一个命名的环境,其中 # 表示用当前的 Julia 版本号替代

在堆栈中,栈顶(列表的第一个元素)总是会被真实地保留下来,但其他的可能产生冲突。